/*
 * @Author: Tendo 
 * @Date: 2021-09-24 10:23:47 
 * @param {number[]} nums
 * @return {number[][]}
 * @desc 双指针法
 */

var threeSum = function (nums) {
    const len = nums.length;
    if (len < 3) return [];
    // 升序排序
    nums.sort((a, b) => a - b);
    const res = [];
    for (let i = 0; i < len - 2; i++) {
        // 如果最小的数都>0, 那么三数之和必不可能等于0
        if (nums[i] > 0) break;
        // a去重，如果nums[i]等于他前一个，就跳到下一次循环
        if (i > 0 && nums[i] === nums[i - 1]) continue;
        // 定义两个指针，一个指向第二个数，另一个指向最后一个数
        let l = i + 1, r = len - 1;
        while (l < r) {
            // 三数求和
            const sum = nums[i] + nums[l] + nums[r];
            // 如果小了就左指针右移，大了就右指针左移
            if (sum < 0) { l++; continue };
            if (sum > 0) { r--; continue };
            res.push([nums[i], nums[l], nums[r]])
            // b c 去重，如果nusm[l]等于他后面一个，就自增
            while (l < r && nums[l] === nums[++l]);
            while (l < r && nums[r] === nums[--r]);
        }
    }
    return res;
};

